<?php
class Service_Amail {
	protected $_to;
	protected $_subject;
	protected $_headers;
	protected $_text;
	protected $_boundary;
	protected $_message;
	public $msgType;
	
	/**
	 * Создаем письмо
	 * 
	 * @param string $to - E-Mail куда отправлять письма
	 * @param string $subject - Заголовок письма
	 * @param string $text - Текст письма
	 * @param string $headers - Дополнительные заголовки
	 * @param string $msgType - Тип письма
	 */
	public function Service_Amail($to, $subject, $text, $headers, $msgType = 'default') {
		$this->_to = $to;
		$this->_subject = '=?utf-8?B?' . base64_encode($subject) . '?=';
		$this->_headers = $headers;
		$this->_text = $text;
		$semiRand = md5(time());
		$this->_boundary = "==Multipart_Boundary_x" . $semiRand . "x";
		$this->_headers .= "X-Mailru-Msgtype: " . $msgType . "\n" . 
		'X-SMTPAPI: {"category": "' . $msgType . '"}' . "\n" . 
		"Date: " . date('r') . "\n" . 
		"MIME-Version: 1.0\n" . 
		"Content-Transfer-Encoding: binary\n" .
		"Content-Type: multipart/related;\n" . 
		" boundary=\"" . $this->_boundary . "\"";
		
		$this->_message .= "This is a multi-part message in MIME format.\n\n" . 
		"--" . $this->_boundary. "\n" . 
		"Content-Type:text/html; charset=\"utf-8\"\n" . 
		"Content-Transfer-Encoding: base64\n" .
		chunk_split(base64_encode($text)) . "\n"; 
	}
	
	/**
	 * Добавляем к письму файл
	 * 
	 * @param string $fileType - Тип файла
	 * @param string $fileName - Название файла
	 * @param string $fileContent - Содержимое файла
	 */
	public function attach($fileType, $fileName, $fileContent) {
		$data = chunk_split(base64_encode($fileContent));
		$this->_message .= "--" . $this->_boundary . "\n" . 
			"Content-Type: " . $fileType. ";\n" . 
			" name=\"" . $fileName . "\"\n" . 
			"Content-ID: <" . $fileName . ">\n" . 
			"Content-Transfer-Encoding: base64\n" . 
			$data . "\n"; 
		unset($data);
		unset($fileType);
		unset($fileName);
	}
	
	/**
	 * Отправляем письмо
	 * 
	 * @param bool $system - Флаг является ли сообщение системным
	 */
	public function send($system = false) {
		Service_Debug::setDebug();
		if (!$system) {
	    // Сохраняем сообщение на всякий случай
      $strToFile = "<html>";
      $strToFile .= '<meta charset="utf-8" />';
      $strToFile .= "<h2>ЗАГОЛОВКИ:</h2>";
      $strToFile .= $this->_headers;
      $strToFile .= "<br />=============";
      $strToFile .= "<h2>КОМУ:</h2>";
      $strToFile .= str_replace(array('<', '>'), array('&lt;', '&gt;'), $this->_to);
      $strToFile .= "<br />=============";
      $strToFile .= "<h2>ТЕМА:</h2>";
      $strToFile .= $this->_subject;
      $strToFile .= "<br />=============";
      $strToFile .= "<h2>СООБЩЕНИЕ:</h2>";
      $strToFile .= $this->_text;
      $strToFile .= "<br />=============<br /></html>";
      $dir = ABSPATH . 'content/mail/' . date("Y_m_d");
     // if (!file_exists($dir)) {
      //	mkdir($dir);
      //	chmod($dir, 0777);
    //  }
    //  $f = fopen(ABSPATH . 'content/mail/' . date("Y_m_d") . '/' . date("Y_m_d__H_i_s") . '_' . $this->msgType . '_' . mt_rand()  . '.htm', 'w');
      //fwrite($f, $strToFile);
      //fclose($f);    
		}
    //Отправляем сообщение
    // Если отправка идет на почту
    if (!defined('MAIL_CLASS_DEFINED')) {
	    return mail($this->_to, $this->_subject, $this->_message, $this->_headers);
    }
    else return true;		
	}

	/**
	 * Отправляем сообщение через IMAP
	 */
	public function imap_send() {
		return imap_mail($this->_to, $this->_subject, $this->_message, $this->_headers);
	}
	
	/**
	 * Считываем файл и добавляем как вложение
	 * 
	 * @param string $file - Путь к файлу
	 */
	public function file($file) {
		$o = fopen($file, "rb");
		$content = fread($o, filesize($file));
		fclose($o);
		$name = basename($file);
		$type = "application/octet-stream";
		$this->attach($type, $name, $content);
	}
	
	/**
	 * Считываем файлы из папки и добавляем как вложения
	 * 
	 * @param string $dir - Путь к папке
	 */
	public function dir($dir) {
		$o = opendir($dir);
		while (($file = readdir($o)) !== false) {
			if ($file != "." && $file != "..") {
				if (is_dir($dir . "/" . $file)) $this->dir($dir . "/" . $file);
				else $this->file($dir . "/" . $file);
			}
		}
	}
	
	/**
	 * Возвращает электронный адрес пользователя вида Иван Иванов <aa@bb.ru>
	 *  
	 * @param array $arrUser - инфа о пользователе
	 */
	public static function getUserEMail($arrUser) {
		Service_Debug::setDebug();
		if (empty($arrUser['e_mail'])) return false;
		if (empty($arrUser['last_name']) || empty($arrUser['first_name'])) return $arrUser['e_mail'];
		else return $arrUser['first_name'] . ' ' . $arrUser['last_name'] . ' <' . $arrUser['e_mail'] . '>';
	}

}
?> 